package com.zsk.file;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class FileTreeUtil {

    public static final String END_STRING = "|__";

    /**
     * 打印文件夹树状结构
     * 
     * @param dirPath
     * @param level
     * @throws IOException
     */
    public static void listDirTree(String dirPath, int level) throws IOException {
        File file = new File(dirPath);
        if (file.isFile()) {
            System.out.println(getBlankString(level) + END_STRING + file.getName());
            return;
        }
        File[] files = file.listFiles();
        for (File tmpFile : files) {
            if (tmpFile.isDirectory()) {
                System.out.println(getBlankString(level) + END_STRING + tmpFile.getName());
                listDirTree(tmpFile.getCanonicalPath(), level + 1);
            } else {
                System.out.println(getBlankString(level) + END_STRING + tmpFile.getName());
            }
        }
    }

    public static String getBlankString(int level) {
        String str = "--";
        for (int i = 0; i < level; i++) {
            str += "---";
        }
        return str;
    }

    static class FileInfo {
        public String id;
        //父id
        public String pid;
        public String name;
        public boolean isDir;

        public FileInfo(String id, String pid, String name, boolean isDir) {
            super();
            this.id = id;
            this.pid = pid;
            this.name = name;
            this.isDir = isDir;
        }

        public FileInfo() {
            super();
        }
    }

    /**
     * 打印list树状结构，FileInfo关联父子关系
     * @param list
     * @param root
     *            id为0的是root
     * @param level
     */
    public static void listDirTree(List<FileInfo> list, FileInfo root, int level, StringBuilder sb) {
        if (!root.isDir) {
            sb.append(getBlankString(level) + END_STRING + root.name + "<br/>\n");
            return;
        }
        for (FileInfo tmpFile : list) {
            if (tmpFile.pid.equals(root.id)) {
                if (tmpFile.isDir && !"0".equals(tmpFile.id)) {
                    sb.append(getBlankString(level) + END_STRING + tmpFile.name + "<br/>\n");
                    listDirTree(list, tmpFile, level + 1, sb);
                } else {
                    sb.append(getBlankString(level) + END_STRING + tmpFile.name + "<br/>\n");
                }

            }
        }
    }

    public static String getUUID() {
        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 8);
    }

    public static void main(String[] args) throws IOException {
        //listDirTree("E:\\code\\niiam-project\\cloud-3d-app\\app\\src\\main\\java", 0);
        List<FileInfo> list = new ArrayList<>();
        FileInfo root = new FileInfo("0", "-1", "Docs", true);
        list.add(root);
        list.add(new FileInfo("1", "0", "1", true));
        list.add(new FileInfo("2", "0", "2", true));
        list.add(new FileInfo("3", "0", "3", true));

        list.add(new FileInfo("11", "1", "11", true));
        list.add(new FileInfo("22", "2", "22", true));
        list.add(new FileInfo("33", "3", "33", true));
        list.add(new FileInfo("44", "1", "44", true));
        list.add(new FileInfo("55", "1", "55", true));
        list.add(new FileInfo("66", "1", "66", true));

        list.add(new FileInfo("111", "11", getUUID() + ".java", false));
        list.add(new FileInfo("222", "11", getUUID() + ".java", false));
        list.add(new FileInfo("333", "11", getUUID() + ".java", false));
        list.add(new FileInfo("444", "11", getUUID() + ".java", false));

        list.add(new FileInfo(getUUID(), "0", getUUID() + ".c", false));
        list.add(new FileInfo(getUUID(), "0", getUUID() + ".c", false));
        list.add(new FileInfo(getUUID(), "0", getUUID() + ".c", false));

        list.add(new FileInfo(getUUID(), "1", getUUID() + ".py", false));
        list.add(new FileInfo(getUUID(), "2", getUUID() + ".py", false));
        list.add(new FileInfo(getUUID(), "3", getUUID() + ".py", false));
        
        System.out.println("|__Docs<br/>");
        StringBuilder sb = new StringBuilder();
        listDirTree(list, root, 1, sb);
        System.out.println(sb.toString());
    }

}
